// mixin 是一种在类之间重用代码的方式，不同于继承，它可以混入多个类的功能

// 定义一个 mixin
mixin Swimming {
  void swim() {
    print('我会游泳');
  }
}

// 定义另一个 mixin
mixin Flying {
  void fly() {
    print('我会飞');
  }
}

// 基类
class Animal {
  String name;
  Animal(this.name);
}

// 使用 with 关键字来混入 mixin
class Duck extends Animal with Swimming, Flying {
  Duck(String name) : super(name);
}

// 只混入游泳能力的企鹅
class Penguin extends Animal with Swimming {
  Penguin(String name) : super(name);
}

void main() {
  var duck = Duck('唐老鸭');
  duck.swim(); // 输出：我会游泳
  duck.fly(); // 输出：我会飞

  var penguin = Penguin('企鹅');
  penguin.swim(); // 输出：我会游泳
  // penguin.fly(); // 错误：企鹅类没有fly方法
}
